#include <stdio.h>
int main()
{
	int a,b;
	scanf("%d %d",&a,&b);
	int a0 = a,b0 = b;
	printf("检查：a:%#X,b:%#X\n",a,b);
	int co = 0;
	int res = 0;
	puts("由于正数的原码就是其补码，因此以下计算机中存储的正数补码视作原码参与计算：");
	for(int i = 1;i <= sizeof(int)*8;i++)
	{
		puts("-----------------------------------------------------------------");
		if((b & 1) == 1)
		{
			//若b的最低位是1，则res加上a
			printf("<1>%d:res = %#X--",res,res);
			res = res + a;
			printf("<2>%d:res + a = %#X\n",res,res);
		} 
		else
		{
			//若b的最低位是0，则res加上0
			printf("<1>%d:res = %#X--",res,res);
			res = res + 0;
			printf("<2>%d:res + 0 = %#X\n",res,res);
		}
		printf("<1>%d:b = %#X--",b,b);
		b =b >> 1;
		printf("<2>%d:b >> 1 = %#X\n",b,b);
		co++;
		if((res & 1) == 1)
		{
			//若res将要右移出的最低位是1,则将其放在右移后b的最高位上
			printf("<1>%d:res = %#X--",res,res);
			res = res >> 1;
			printf("<2>%d:res >> 1 = %#X\n",res,res);
			printf("<1>%d:b = %#X--",b,b);
			b = b | -2147483648;//将右移后的b的最高位变为1，此1是res右移出的1
			printf("<2>%d:b | -2147483648 = %#X\n",b,b);
		}
		else
		{
			//若res将要右移出的最低位是0,则将其放在右移后b的最高位上
			printf("<1>%d:res = %#X--",res,res);
			res = res >> 1;
			printf("<2>%d:res >> 1 = %#X\n",res,res);
			printf("<1>%d:b = %#X--",b,b);
			b = b & 2147483647;//将右移后的b的最高位变为0，此0是res右移出的0
			printf("<2>%d:b & 2147483647 = %#X\n",b,b);	
		}
		puts("-----------------------------------------------------------------");
	}
    
    printf("\n%d乘%d的积（原码）：高32位：res = %#X,低32位：b = %#X\n\n",a0,b0,res,b);
 
    int t = 0;
    int tres = res;
    t = -2147483648;//t:1000 0000 0000 0000__0000 0000 0000 0000
    printf("【");
    for(int i = 1;i <= 32;i++,tres = tres << 1)
    {
    	//tres = tres << 1,每次把tres向左移位，然后跟“1000 0000 0000 0000__0000 0000 0000 0000”按位&，判断最高是1还是0
        //通过判断32次tres的最高位是1还是0，即可解析出res二进制每位是0还是1 
    	if((tres & t) == t)
    	{
            if(i != 1 && i % 4 == 1)
            {
                printf("_");
            }
            printf("1");
        }
        else
        {
            if(i != 1 && i % 4 == 1)
            {
                printf("_");
            }
            printf("0");
        }
    }//解析出二进制每位是0还是1 
    printf("】--【");
    int tb = b;
    for(int i = 1;i <= 32;i++,tb = tb << 1)
    {
        //tb = tb << 1,每次把tres向左移位，然后跟“1000 0000 0000 0000__0000 0000 0000 0000”按位&，判断最高是1还是0
        //通过判断32次tres的最高位是1还是0，即可解析出b二进制每位是0还是1 
        if((tb & t) == t)
        {
            if(i != 1 && i % 4 == 1)
            {
                printf("_");
            }
            printf("1");
        }
        else
        {
            if(i != 1 && i % 4 == 1)
            {
                printf("_");
            }
            printf("0");
        }
    }
    printf("】");
    return 0;
}